import {
  ElMessage,
  ElMessageBox,
  ElNotification,
  ElLoading,
  type ElMessageBoxOptions
} from 'element-plus'
import type { LoadingInstance } from 'element-plus/es/components/loading/src/loading'

export class Feedback {
    private loadingInstance: LoadingInstance | null = null
    static instance: Feedback | null = null
    static getInstance() {
      return this.instance ?? (this.instance = new Feedback())
    }

    // 消息提示
    msg(msg: string) {
      ElMessage.info(msg)
    }

    // 错误消息
    msgError(msg: string) {
      ElMessage.error(msg)
    }

    // 成功消息
    msgSuccess(msg: string) {
      ElMessage.success(msg)
    }

    // 警告消息
    msgWarning(msg: string) {
      ElMessage.warning(msg)
    }

    // 弹出提示
    alert(msg: string) {
      ElMessageBox.alert(msg, '系统提示')
    }

    // 错误提示
    alertError(msg: string) {
      ElMessageBox.alert(msg, '系统提示', { type: 'error' })
    }

    // 成功提示
    alertSuccess(msg: string) {
      ElMessageBox.alert(msg, '系统提示', { type: 'success' })
    }

    // 警告提示
    alertWarning(msg: string) {
      ElMessageBox.alert(msg, '系统提示', { type: 'warning' })
    }

    // 通知提示
    notify(msg: string) {
      ElNotification.info(msg)
    }

    // 错误通知
    notifyError(msg: string) {
      ElNotification.error(msg)
    }

    // 成功通知
    notifySuccess(msg: string) {
      ElNotification.success(msg)
    }

    // 警告通知
    notifyWarning(msg: string) {
      ElNotification.warning(msg)
    }

    // 确认窗体
    confirm(msg: string) {
      return ElMessageBox.confirm(msg, '温馨提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
    }

    // 提交内容
    prompt(content: string, title: string, options?: ElMessageBoxOptions) {
      return ElMessageBox.prompt(content, title, {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        ...options
      })
    }

    // 打开全局loading
    loading(msg: string) {
      this.loadingInstance = ElLoading.service({
        lock: true,
        text: msg
      })
    }

    // 关闭全局loading
    closeLoading() {
      this.loadingInstance?.close()
    }
}

const feedback = Feedback.getInstance()

export default feedback
